﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//题目：移除元素
//给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
//不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
//元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
//int removeElement(int* nums, int numsSize, int val)
//{
//	//先创建两个变量
//	int src, dst;
//	src = dst = 0;
//	while (src < numsSize)
//	{
//		if (nums[src] == val)
//		{
//			src++;
//		}
//		else
//		{
//			nums[dst] = nums[src];
//			dst++;
//			src++;
//		}
//	}
//	//此时dst的值刚好就是新数组的有效长度
//	return dst;
//}
//
//int main()
//{
//	//思路1：创建新的数组，遍历原数组，将不为val的值放到新数组中。（❌）这里不能使用
//	//思路2：创建两个遍历src,dst
//	//1）若src指向的值不为val,则src++
//	//2)若src指向的值不是val,则把src的值赋值给dst,然后dst++,src++.
//	//nums[dst] = num[src],src++,dst++.
//
//	int arr[] = { 3,2,2,3 };
//	int count = removeElement(arr, sizeof(arr) / sizeof(arr[0]), 2);
//	for (int i = 0; i < count; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

//合并两个有序数组
//给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2，另有两个整数 m 和 n ，分别表示 nums1 和 nums2 中的元素数目。
//请你 合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列。
//注意：最终，合并后数组不应由函数返回，而是存储在数组 nums1 中。为了应对这种情况，nums1 的初始长度为 m + n，其中前 m 个元素表示应合并的元素，后 n 个元素为 0 ，应忽略。nums2 的长度为 n。


//思路1：将num2中的数据依次放入到num1数组的后面，用排序算法对num1进行排序
//借助效率低下的排序算法会影响到整体的运行效率
//从后往前比大小：比谁大，谁大谁往后放
//nums1Size:nums1数组的长度
//nums2Size:nums2数组的长度
//上面这两个参数用不上
void merge(int* nums1 ,int nums1Size, int m ,int* nums2,int nums2Size,int n)
{
	int l1, l2, l3;
	l1 = m - 1;
	l2 = n - 1;
	l3 = m + n - 1;

	while (l1 >= 0 && l2 >= 0)//只要有一个条件为假就跳出循环
	{
		if (nums1[l1] > nums2[l2])
		{
			nums1[l3] = nums1[l1];
			l3++;
			l1++;
		}
		//nums1[l1]<nums2[l2]
		else
		{
			nums1[l3] = nums2[l2];
			l3++;
			l2++;
		}
		//出了循环有两种情况：l1 >= 0 或者 l2 >= 0
		//不可能出现同时大于等于0的情况，只需要处理 l2>=0 (说明l2中的数据还没完全放入到num1中)

		//l2先出循环，说明数组nums1已然有序，不需要进行处理
		while (l2 >= 0)
		{
			nums1[l3--] = nums2[l2--];

		}
		//此时nums1中包含了nums2中的数据，nums1是升序数组
	}
}

int main()
{

	return 0;
}